﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include "GcmpModelInterface.h"
#include "IDbObject.h"
#include <limits>

namespace gcmp
{
    class IElement;
    class IParameter;
    struct Any;

    /// \brief 参数验证器接口类
    class GCMP_MODEL_INTERFACE_EXPORT IParameterValidator : public IDbObject
    {
        DEFINE_CAST_DERIVED(gcmp::IParameterValidator, gcmp::IDbObject);
    public:
        /// \brief 克隆一个新的验证器
        /// \return OwnerPtr<IParameterValidator> 克隆出来的新Validator
        virtual OwnerPtr<IParameterValidator> Clone() const = 0;

    public:

        /// \brief 验证接口
        ///
        /// 当验证不通过时，若使用平台提供的默认提示窗口，可将错误信息写入pErrorMessage中。
        /// 否则不要在pErrorMessage中写入数据。
        ///
        /// \param Parameter 待验证的参数
        /// \param pElement  待验证参数所在Element
        /// \param pErrorMessage 传出参数, 错误信息。
        /// \return bool true 验证通过，false 验证不通过
        virtual bool Validate(const IParameter* pNewParameter, const IElement* pElement, std::wstring* pErrorMessage) const = 0;
    
    public:

        /// \brief  创建一个默认的Int范围验证器
        ///
        ///  这里的范围验证采用左闭右开的区间界定, 假如待验证数值为x，
        ///     若： min<=x<max 则返回true, 否则返回false
        ///
        /// \param min 最小值
        /// \param max 最大值
        /// \return OwnerPtr<IParameterValidator> 创建出来的默认验证器
        static OwnerPtr<IParameterValidator> CreatetIntRangeValidator(Int32 min, Int32 max);

        /// \brief  创建一个默认的Double范围验证器
        ///
        ///  这里的范围验证采用左闭右开的区间界定, 假如待验证数值为x，
        ///     若： min<=x<max 则返回true, 否则返回false
        ///
        /// \param min 最小值
        /// \param max 最大值
        /// \return OwnerPtr<IParameterValidator> 创建出来的默认验证器
        static OwnerPtr<IParameterValidator> CreateDoubleRangeValidator(double min, double max);

        /// \brief  创建一个默认的Geometry范围验证器
        ///
        ///  这里的范围验证采用继承自IGeometry的子类进行验证
        ///     目前只有IBody,ILoop,IPolyCurve及其子类有验证
        ///
        /// \return OwnerPtr<IParameterValidator> 创建出来的默认验证器
        static OwnerPtr<IParameterValidator> CreatetGeometryRangeValidator();
     };

    class IElement;
    class IParameter;

    /// \brief 新参数验证器接口类，配合IParameterValidatorManager使用
    ///
    /// INewParameterValidator不存储数据，与ParameterDefination为1:1的关系，通过IParameterValidatorManager.h中的
    class GCMP_MODEL_INTERFACE_EXPORT INewParameterValidator : public IObject
    {
        DEFINE_CAST_DERIVED(gcmp::INewParameterValidator, gcmp::IObject);
    public:

        /// \brief 验证接口
        ///
        /// 当验证不通过时，若使用平台提供的默认提示窗口，可将错误信息写入pErrorMessage中。
        /// 否则不要在pErrorMessage中写入数据。
        ///
        /// \param Parameter 待验证的参数
        /// \param pElement  待验证参数所在Element
        /// \param pErrorMessage 传出参数, 错误信息。
        /// \return bool true 验证通过，false 验证不通过
        virtual bool Validate(const IParameter* pNewParameter, const IElement* pElement, std::wstring* pErrorMessage) const = 0;
    };
}



